
#include "Caneria.h"
#include "../FabricasObjetosJuego.h"

Caneria::Caneria(int x, int y, int maximoX, int maximoY, Orientacion orientacion) : ObjetoEstatico(x, y, maximoX, maximoY, orientacion) {
	
	tiempoUltimaFabricacion = 0;
	srand( time(NULL) );
	
	tipo = OBSTACULO;
}

pair<idImagen_t, int> Caneria::getDibujable(Uint32 time) {
	
	if (time - tiempoUltimaFabricacion > LAPSUS_MINIMO_FABRICACIONES_CANERIA) {
		if (rand() % 100 > 50) {
			
			if (orientacion == Derecha) FabricaEnemigos::CrearObjeto(posicion.getX() + ancho, posicion.getY() + alto, orientacion);
			if (orientacion == Izquierda) FabricaEnemigos::CrearObjeto(posicion.getX(), posicion.getY() + alto, orientacion);
			
			tiempoUltimaFabricacion = time;
		}
	}
	
	return ObjetoEstatico::getDibujable(time);
}

void Caneria::ColisionarConPersonaje(ObjetoEstatico* personaje, int colX, int colY, int colXvieja, int colYvieja) {

	int ZONA_COLISION_X = static_cast<Personaje*> (personaje)->getAncho() * 0.1;
	int ZONA_COLISION_Y = static_cast<Personaje*> (personaje)->getAlto() * 0.1;

	if (colXvieja != 0) {
		if (static_cast<Personaje*> (personaje)->getVelocidadY() < 0) {
			static_cast<Personaje*> (personaje)->setVelocidadY(0);
			if (static_cast<Personaje*> (personaje)->getEstado() == EstadoBasico::Saltando) static_cast<Personaje*> (personaje)->setEstado(EstadoBasico::Quieto);
			static_cast<Personaje*> (personaje)->setPosicion(static_cast<Personaje*> (personaje)->getX(), getY() - static_cast<Personaje*> (personaje)->getAlto());
		}
		else {
			static_cast<Personaje*> (personaje)->setVelocidadY(static_cast<Personaje*> (personaje)->getVelocidadY() * (-1));
			static_cast<Personaje*> (personaje)->setPosicion(static_cast<Personaje*> (personaje)->getX(), getY() + getAlto() - ZONA_COLISION_Y);
		}
	}
	else if (colYvieja !=0) {
		if (static_cast<Personaje*> (personaje)->getVelocidadX() < 0) static_cast<Personaje*> (personaje)->setPosicion(getX() + getAncho() - ZONA_COLISION_X, static_cast<Personaje*> (personaje)->getY());
		else static_cast<Personaje*> (personaje)->setPosicion(getX() - static_cast<Personaje*> (personaje)->getAncho() + ZONA_COLISION_X, static_cast<Personaje*> (personaje)->getY());
	}
	else {
		if (colX >= colY) {
			if (static_cast<Personaje*> (personaje)->getVelocidadY() < 0) {
				static_cast<Personaje*> (personaje)->setVelocidadY(0);
				if (static_cast<Personaje*> (personaje)->getEstado() == EstadoBasico::Saltando) static_cast<Personaje*> (personaje)->setEstado(EstadoBasico::Quieto);
				static_cast<Personaje*> (personaje)->setPosicion(static_cast<Personaje*> (personaje)->getX(), getY() - static_cast<Personaje*> (personaje)->getAlto());
			}
			else {
				static_cast<Personaje*> (personaje)->setVelocidadY(static_cast<Personaje*> (personaje)->getVelocidadY() * (-1));
				static_cast<Personaje*> (personaje)->setPosicion(static_cast<Personaje*> (personaje)->getX(), getY() + getAlto() - ZONA_COLISION_Y);
			}
		}
		else {
			if (static_cast<Personaje*> (personaje)->getVelocidadX() < 0) static_cast<Personaje*> (personaje)->setPosicion(getX() + getAncho() - ZONA_COLISION_X, static_cast<Personaje*> (personaje)->getY());
			else static_cast<Personaje*> (personaje)->setPosicion(getX() - static_cast<Personaje*> (personaje)->getAncho() + ZONA_COLISION_X, static_cast<Personaje*> (personaje)->getY());
		}
	}
}


void Caneria::ColisionarConEnemigo(ObjetoEstatico* movible, int colX, int colY, int colXvieja, int colYvieja) {

	ObjetoMovible* mov = dynamic_cast<ObjetoMovible*> (movible);

	int ZONA_COLISION_Y = mov->getAlto() * 0.1;

	if (colXvieja != 0) {
		if (mov->getVelocidadY() <= 0) {
			mov->setVelocidadY(0);
			mov->setPosicion(mov->getX(), getY() - mov->getAlto());
			if (mov->getEstado() == EstadoBasico::Saltando) mov->setEstado(EstadoBasico::Quieto);
		}
		else {
			mov->setVelocidadY(mov->getVelocidadY() * (-1));
			mov->setPosicion(mov->getX(), getY() + getAlto() - ZONA_COLISION_Y);
		}
	}
	else if (colYvieja !=0 ) mov->CambiarSentido(getX(), getAncho());

	else {
		if (colX >= colY) {
			if (mov->getVelocidadY() < 0) {
				mov->setVelocidadY(0);
				mov->setPosicion(mov->getX(), getY() - mov->getAlto());
				if (mov->getEstado() == EstadoBasico::Saltando) mov->setEstado(EstadoBasico::Quieto);
			}
			else {
				mov->setVelocidadY(mov->getVelocidadY() * (-1));
				mov->setPosicion(mov->getX(), getY() + getAlto() - ZONA_COLISION_Y);
			}
		}
		else mov->CambiarSentido(getX(), getAncho());
	}
}
